package com.moblie.controller;

import com.alibaba.dubbo.config.annotation.Reference;



import com.moblie.constant.MessageConstant;
import com.moblie.constant.RedisConstant;

import com.moblie.domain.Evaluate;
import com.moblie.entity.Result;
import com.moblie.service.EvaluateService;
import com.moblie.utils.QiniuUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import redis.clients.jedis.JedisPool;

import java.io.IOException;
import java.util.ArrayList;
import java.util.UUID;



/*
点评相关controller
* */

//用RestController,表示在controller的基础上增减responsebody,不跳转到到视图
@CrossOrigin(allowCredentials="true",allowedHeaders="*")
@RestController
@RequestMapping("/evaluate")
public class EvaluateController {

    // 需要用@Referencr注解,找到对应的服务
    @Reference
    private EvaluateService evaluateService;
    // 自动注入jedispool
    private JedisPool jedisPool;


    /*
   通过点评信息,将其存储到点评对象中,实现点评信息的存储
   * */
    @RequestMapping("/grade")
    public Result publish(@RequestBody String[] points ) {
        //将口味,环境,服务,食材的分数通过integer数组封装
        // 1.将该数组求和并取平均值
        int sum=0;
        if (points!=null&&points.length>0){
            for (int i = 0; i <points.length ; i++) {
                // 将string类型转换为int类型,在进行循环求和
                sum +=Integer.parseInt(points[i]);
            }
        }
        double avgPoint = sum/points.length;
        // 2.将该平均分四舍五入得到总分,并返回总分
        long totalPoint = Math.round(avgPoint);
        //返回result对象
        return new Result(true,"",totalPoint);

    }


/*
上传点评时添加的图片信息
 因为已经在spring-mvc文件中定义了上传组件,所以可以用MultipartFile来接收图片
 @RequestParam("imgFile")表示该图片的请求参数名称,需要和MultipartFile的形参相同
 (如果形参名和传递过来的name相同,则不需要该注解)
 * */
        @RequestMapping("/upload")
        public Result upload (@RequestParam("imgFiles") MultipartFile[]imgFiles){
            try {
                // 遍历该imgFiles
                ArrayList<String> filenames = new ArrayList<>();
                for (MultipartFile imgFile : imgFiles) {
                    // 1.将imgFile文件转换成byte字节
                    byte[] bytes = imgFile.getBytes();
                    // 2.在通过UUID的randomUUID随机生成唯一辨识码,toString转换为string类型的
                    String str_uuid = UUID.randomUUID().toString();
                    // 3. 再获取该图片的真实文件名
                    String originalFilename = imgFile.getOriginalFilename();
                    // 3.1 .获取该文件名的后缀,让生成的uuid和该后缀名拼接(保证图片上传后的文件类型不变)
                    // 先获取从最后一个.的索引
                    int index = originalFilename.lastIndexOf(".");
                    // 3.2 在用substring,从该索引的截取,可以得到文件后缀
                    String filetype = originalFilename.substring(index);
                    // 4.再将uuid和该文件后缀拼接,得到上传后的文件名
                    String filename = str_uuid + filetype;
                    // 5.调用QiniuUtils的upload2Qiniu方法,bytes和filename作为参数,上传该图片
                    QiniuUtils.upload2Qiniu(bytes, filename);
                    // 6.上传成功后将该图片名先存储到redis中的evaluatePicResources的集合中
                    jedisPool.getResource().sadd(RedisConstant.EVALUATE_PIC_RESOURCES, filename);
                    // 再将filename存入filenames的集合中
                    filenames.add(filename);
                }
                // 7.当图片均上传成功后,返回上传成功提示,data为上传成功的图片名称集合(用于存储到数据库)
                return new Result(true,MessageConstant.PIC_UPLOAD_SUCCESS, filenames);
            } catch (IOException e) {
                e.printStackTrace();
                // 8. 如果上传失败,则返回result的falg为false,message为上传失败
                return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);
            }
        }


    /*
    通过点评信息,将其存储到点评对象中,实现点评信息的存储
    * */
        @RequestMapping("/publish")
        public Result publish (@RequestBody Evaluate evaluate){
            // 将发表的信息通过evaluate类接收
            try {
                // 1. 调用service中的publish方法,发表评论
                evaluateService.publish(evaluate);
                // 2.发表评论成功,则返回成功提示
                return new Result(true, MessageConstant.PUBLISH_EVALUATE_SUCCESS);
            } catch (Exception e) {
                e.printStackTrace();
                // 3.发表评论失败,则返回失败提示
                return new Result(false, MessageConstant.PUBLISH_EVALUATE_FAIL);
            }
        }

    }
